OpenCV是个什么东西呢?它的全称是Open source Computer Vision Library,开放源代码计算机视觉库,如上图所示我们看到的正是OpenCV的logo,可以看到由鲜明的R、G、B三基色的三个小圆环构成,也就是说,它是一套关于计算机视觉的开放源代码的API函数库。这也就意味着,
(1)不管是科学研究,还是商业应用,都可以利用它来作开发;
(2)所有API函数的源代码都是公开的,你可以看到其内部实现的程序步骤;
(3)你可以修改OpenCV的源代码,编译生成你需要的特定API函数。
在Jetbotmini上的部分图像处理也用到了OpenCV的函数库的某些函数,或者可以说在绝大部分图像处理设计领域都离开它的存在了,早在许多年前至今在入侵检测、特定目标跟踪、目标检测、人脸检测、人脸识别、人脸跟踪等领域,opencv可谓大显身手,而这些,仅仅是其应用的冰山一角。既然我们认识到OpenCV如此的通用,在这章节课程中会给你介绍几种我们我们课程中用到的一些很基础的图像处理函数,也是一些通用的函数,在这里我们先对这些知识大致了解一番后,在后面有颜色识别并追踪、人脸识别并追踪两个实践项目教大家上手,但是OpenCV提供的强大应用功能远不止于此,如果你对Opencv计算机视觉库开发很感兴趣想深入了解的话下面提供了几个网站可供大家参考研究学习:
OpenCV 官方主页:https://www.opencv.org
OpenCV 中文论坛:http://www.opencv.org.cn
OpenCV CSDN 论坛:https://bbs.csdn.net/forums/OpenCV
img = cv2.imread('yahboom.jpg', 0) :第一个参数是图片的路径,第二个参数是如何读取这幅图片;
cv2.IMREAD_COLOR:以灰度模式读入图片,可以用0表示;
cv2.IMREAD_GRAYSCALE,1:读入一副彩色图片,可以用1表示;
cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道,可以用2表示。2、图像的保存;
cv2.imwrite(‘car.jpg’, img) :第一个参数是保存的文件名,第二个参数是保存的图像。
学习视频的读取,显示和保存视频。函数为 cv2.VideoCapture()和 cv2.VideoWrite();
从摄像头获取视频流:
打开摄像头:cap = cv2.VideoCapture(0)
- 参数 0 表示设备的默认摄像头,当设备有多个摄像头时可以改变参数选择
读取摄像头的视频流:ret, frame = cap.read()
- 无参数,但需放在死循环中不断读取形成视频
释放摄像头资源:cap.release()
- 无参数,程序关闭之前务必关闭摄像头,释放资源。
读取视频文件:cap = cv2.VideoCapture(‘filename’)
在Jetbotcamera驱动camera.py中就是用该函数获取摄像头的视频流数据
xxxxxxxxxx
super(Camera, self).__init__(*args, **kwargs)
try:
self.cap = cv2.VideoCapture(self._gst_str(), cv2.CAP_GSTREAMER)
re, image = self.cap.read()
保存视频:
创建一个 VideoWriter 对象,并指定输出文件名
指定使用XVID编码器:fourcc = cv2.VideoWriter_fourcc(*’XVID’)
指定输出文件:out = cv2.VideoWriter(‘output.avi’, fourcc, 20.0, (640,480))
上面函数参数依次表示输出视频名称,编码器,帧率,帧宽和高
学习使用 OpenCV绘制不同的几何图形,相关函数为 cv2.line(), cv2.circle(), cv2.rectangle(), cv2.putText()等。
绘制直线:
xxxxxxxxxx
cv2.line(img, startPoint, endPoint, color, thickness)
参数解释:
img | 需要绘制的目标图像对象 |
---|---|
startPoint | 起始位置像素坐标 |
endPoint | 结束位置像素坐标 |
color | 绘制使用的颜色 |
thickness | 绘制的线条宽度 |
绘制圆:
xxxxxxxxxx
cv2.circle(img, centerPoint, radius, color, thickness)
参数解释:
img | 需要绘制的目标图像对象 |
---|---|
centerPoint | 绘制的圆的圆心位置像素坐标 |
radius | 绘制的圆的半径 |
color | 绘制使用的颜色 |
thickness | 绘制的线条宽度(thickness 是负数是表示圆被填充) |
绘制矩形:
xxxxxxxxxx
cv2.rectangle(img, point1, point2, color, thickness)
point1 为左上顶点,point2 为 point1 对角线上的另一个顶点
参数解释:
img | 需要绘制的目标图像对象 |
---|---|
point1 | 左上顶点位置像素坐标 |
point2 | 右下顶点位置像素坐标 |
color | 绘制使用的颜色 |
thickness | 绘制的线条宽度 |
书写文本:
xxxxxxxxxx
cv2.putText( img, text, point, font, size, color, thickness )
text 为要写的文本,point 为第一个字符的左下坐标,font 为字体类型,size 为字体大小
参数解释:
img | 需要绘制的目标图像对象 |
---|---|
text | 绘制的文字 |
point | 左上顶点位置像素坐标 |
font | 绘制的文字格式 |
size | 绘制的文字大小 |
color | 绘制使用的颜色 |
thickness | 绘制的线条宽度 |
这个函数功能我觉得在使用多AI模型框架的时候显得特别重要,因为如果我们的应用需要使用到两个不同框架或者不同训练方式训练出来的模型时,但是我们从摄像头一开始设定好捕获的图像分辨率是固定的,他们的模型运算的分辨率却又不一致,这时我们就可以使用上OpenCV的图片缩放函数将图片缩放至目标分辨率进行AI运算。
函数原型:
xxxxxxxxxx
cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation)
参数解释:
InputArray src | 输入图片 |
---|---|
OutputArray dst | 输出图片 |
Size | 输出图片尺寸 |
fx, fy | 沿x轴,y轴的缩放系数 |
interpolation | 插入方式 |
HSV颜色空间简介:
RGB 颜色空间是大家最熟悉的颜色空间,即三基色空间,任何一种颜色都可以由该三种 颜色混合而成。然而一般对颜色空间的图像进行有效处理都是在 HSV 空间进行的,HSV(色 调 Hue,饱和度 Saturation,亮度 Value)是根据颜色的直观特性创建的一种颜色空间, 也称六角 锥体模型。
为什么会选择 HSV 空间而不是 RGB 空间?对于图像而言,识别相应的颜色在 RGB 空间、 HSV 空间或者其它颜色空间都是可行的。之所以选择 HSV,是因为 H 代表的色调基本上可以 确定某种颜色,再结合饱和度和亮度信息判断大于某一个阈值。而 RGB 由三个分量构成, 需要判断每种分量的贡献比例。即 HSV 空间的识别的范围更广,更方便。
三种颜色空间的转换(gray BGR HSV):
在OpenCV中有超过150种的颜色空间转换的方法,但是我们经常会用到的也就只有两种,即 BGR->Gray 和 BGR->HSV。注意 Gray 和 HSV 不可以互相转换。
颜色空间转换:cv2.cvtColor(input_image, flag)
BGR->Gray: flag 就是 cv2.COLOR_BGR2GRAY
BGR->HSV: flag 就是 cv2.COLOR_BGR2HSV
OpenCV 中 HSV 颜色空间的取值范围:H [0, 179] S [0, 255] V [0, 255]